#include "abstractmodelxmlwriter.h"
#include <QModelIndex>
#include <QAbstractItemModel>
#include <QXmlStreamWriter>
#include <QDebug>
#include <QIODevice>
#include <QFile>
#include <QRect>

AbstractModelXmlReaderWriter::AbstractModelXmlReaderWriter(QAbstractItemModel *M, QObject *parent) :
	QObject(parent), writer(new QXmlStreamWriter()), m(M){
	init();
}

AbstractModelXmlReaderWriter::AbstractModelXmlReaderWriter(QIODevice *d, QAbstractItemModel *M, QObject *parent) :
	QObject(parent), writer(new QXmlStreamWriter(d)), m(M){
	init();
}

AbstractModelXmlReaderWriter::AbstractModelXmlReaderWriter(const QString &fn, QAbstractItemModel *M, QObject *parent) :
	QObject(parent), writer(new QXmlStreamWriter(new QFile(fn, this))), m(M){
	init();
}

AbstractModelXmlReaderWriter::~AbstractModelXmlReaderWriter(){
	delete writer;
}

void AbstractModelXmlReaderWriter::init(){
	writer->setAutoFormatting(true); // Расставлять в файле переносы и табуляцию.
	writer->setAutoFormattingIndent(-1); // Делать отступ 1-им табом.
	// Кодировка по умолчанию utf8.
}

bool AbstractModelXmlReaderWriter::writeNode(const QModelIndex &i) const{
	// Работаю только, если есть модель.
	if (m == NULL){ // Если указатель не указывает на модель
		qDebug()<<trUtf8("Указатель не указывает на модель.");
		return false;
	}
	else // Если указатель указывает на модель
		if(i.isValid()){
//----Запишу текущую строку.-----------------------------------------
			bool res = true;
			int r = i.row();
			QModelIndex p = i.parent();
			writer->writeStartElement(m->index(r, 0, p).data().toString());
			// Запишу атрибуты.
			for(int j = 1; j < m->columnCount(i.parent()); j+=2){
				writer->writeAttribute(m->index(r, j, p).data().toString(),
															 m->index(r, j + 1, p).data().toString());
			}
			// Запишу дочерние.
			for(int j = 0; j < m->rowCount(i); ++j){
				res &= writeNode(m->index(0, 0, i));
			}
			writer->writeEndElement();
			return res;
//-------------------------------------------------------------------
		}else{
			qDebug()<<trUtf8("Некоректный индекс");
			return false;
		}
}


/** Записать данные в xml.*/
void AbstractModelXmlReaderWriter::write(){
	//Если пишем в файл, то открываю его.
	QFile *f = 0;
	if(f = qobject_cast<QFile *>(writer->device()))
		f->open(QIODevice::ReadWrite);

	writer->writeStartDocument();
	// На верхнем уровне xml один элемент.
	writer->writeStartElement(trUtf8("Анкета"));

	// Запишу все строки верхнего уровня модели, как элементы 2-го уровня xml.
	for(int i = 0; i < m->rowCount(); ++i){
		if(writeNode(m->index(i, 0)));else
			qDebug()<<trUtf8("Ошибка записи элемента");
	}
	writer->writeEndElement(); // Анкета
	writer->writeEndDocument();

	//Если пишем в файл, то закрываю его.
	if(f){
		f->close();
//		delete f;
	}
}

QIODevice * AbstractModelXmlReaderWriter::device () const{
	return writer->device();
}

const QString & AbstractModelXmlReaderWriter::fileName() const{
	//Если пишем в файл, то передам его имя.
	QFile *f = 0;
	if(f = qobject_cast<QFile *>(writer->device()))
		return f->fileName();
	else
		return QString();
}

void AbstractModelXmlReaderWriter::setModel(QAbstractItemModel *M){
	m = M;
}

QAbstractItemModel * AbstractModelXmlReaderWriter::model() const{
	return m;
}

QString AbstractModelXmlReaderWriter::getAtrName(const QModelIndex &, int n){
	return QString::number(n);
}

QRect AbstractModelXmlReaderWriter::getAreaAtr(const QModelIndex &){
	return QRect(0, 0, m->rowCount(), m->columnCount());
}

QString AbstractModelXmlReaderWriter::getNodeName(const QModelIndex & p, int){
	QModelIndex index = p;
	int i = 0;
	for(; index != QModelIndex(); ++i)
		index = index.parent();
	return QString::number(i);
}

int AbstractModelXmlReaderWriter::getNodeCount(const QModelIndex & p){
	m->rowCount(p);
}

QString AbstractModelXmlReaderWriter::getAtrValue(const QModelIndex & parent, int nNode, int nAtr){

}
